package br.org.bertol.mestrado.engine.optimisation.sls;

import br.org.bertol.mestrado.Verify;
import br.org.bertol.mestrado.engine.optimisation.AbstractMetaHeuristica;
import br.org.bertol.mestrado.engine.optimisation.Operacao;
import br.org.bertol.mestrado.engine.optimisation.entity.AbstractUnit;
import br.org.bertol.mestrado.engine.optimisation.hillclimbing.HillClimbing;

/**
 * @author contaqualquer
 * @param <U>
 */
public abstract class AbstractStochasticLocalSearch<U extends AbstractUnit>
        extends AbstractMetaHeuristica<U> {

    /***/
    protected final transient U               startUnit;

    /***/
    protected transient U                     betterUnit;

    /***/
    protected final transient HillClimbing<U> hillClimbing;

    /**
     * @param verify
     *            Objeto verify
     * @param numIteracoes
     *            Máximo de iterações
     * @param sUnit
     *            Unidade inicial
     */
    @SuppressWarnings("unchecked")
    public AbstractStochasticLocalSearch(final Verify verify,
        final long numIteracoes,
        final U sUnit) {
        super(verify, numIteracoes);

        this.startUnit = sUnit;

        hillClimbing = new HillClimbing<U>(verify, null, 50, false,
                (Operacao<U>) SlsMovement.busca_local, null, null);

    }

    /**
     * Retorna o a unidade com custo melhorado.
     * @return Unidade
     */
    public final U getBetterUnit() {
        return betterUnit;
    }

}